//给定一个二叉树根节点，请你判断这棵树是不是二叉搜索树。
//
//二叉搜索树满足每个节点的左子树上的所有节点均小于当前节点且右子树上的所有节点均大于当前节点。

public class Solution {
      public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
        public TreeNode(int val) {
          this.val = val;
        }
      }
    public boolean isValidBST (TreeNode root) {
          /*
          * 如果当前节点为空，返回true。
            检查当前节点的值是否在允许的范围内（min < val < max）。
            递归检查左子树，此时最大值变为当前节点的值。
            递归检查右子树，此时最小值变为当前节点的值。
            左右子树都满足条件，则返回true，否则返回false。*/

        return helper(root,null,null);
    }
    public boolean helper(TreeNode root ,Integer min,Integer max){
        if(root == null){
            return true;
        }
        if(min != null && root.val <= min || max != null && root.val >= max){
            return false;
        }
        return helper(root.left,min,root.val) && helper(root.right,root.val,max);
    }
}
